home *** CD-ROM | disk | FTP | other *** search
/ MacFormat España 4 / MacFormat n. 4 (Spain) / MacFormat 4.bin / La ciudad del ShareWare / Desarrollo / ICAppSourceKit1.0 / ICHelperWhat.p < prev    next >
Encoding:
Text File  |  1994-11-28  |  14.8 KB  |  534 lines

  1. unit ICHelperWhat;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenHelper (wt: WindowType; item: integer): OSErr;
  9.     function WhatActivateHelper (wt: WindowType; item: integer; activate: boolean): OSErr;
  10.     function WhatFlushHelper (wt: WindowType; item: integer): OSErr;
  11.     function WhatCloseHelper (wt: WindowType; item: integer): OSErr;
  12.     function WhatClickHelper (wt: WindowType; item: integer; er: eventRecord): OSErr;
  13.     function WhatKeyHelper (wt: WindowType; item: integer; er: EventRecord): OSErr;
  14.     function WhatCursorHelper (wt: WindowType; item: integer; pt: Point; cursorid: integer): OSErr;
  15.  
  16. implementation
  17.  
  18.     uses
  19.         IconFamilies, ICStrH, 
  20.  
  21.         ICKeys, ICAPI, ICSubs, ICDialogs, ICMiscSubs, ICDocUtils, ICGlobals, ICIConSuites, ICStandardFile;
  22.  
  23.     const
  24.         ditChange = 1;
  25.         ditMainUserItem = 2;
  26.         ditAdd = 3;
  27.         ditDelete = 4;
  28.         ditList = 5;
  29.  
  30.     const
  31.         ditOK = 1;
  32.         ditCancel = 2;
  33.         ditAddUserItem = 3;
  34.         ditHelper = 4;
  35.         ditAppName = 5;
  36.         ditChooseApplication = 6;
  37.  
  38.     const
  39.         kCellHeight = 36;
  40.  
  41.     type
  42.         InternalAppSpec = record
  43.                 key: Str255;
  44.                 locked: boolean;
  45.                 appspec: ICAppSpec;
  46.             end;
  47.  
  48.     procedure GetNthElement (entries: Handle; index: integer; var res: InternalAppSpec);
  49.     begin
  50.         BlockMove(Ptr(longint(entries^) + (index - 1) * sizeof(InternalAppSpec)), @res, sizeof(InternalAppSpec));
  51.     end; (* GetNthElement *)
  52.  
  53.     procedure SetNthElement (entries: Handle; index: integer; var res: InternalAppSpec);
  54.     begin
  55.         BlockMove(@res, Ptr(longint(entries^) + (index - 1) * sizeof(InternalAppSpec)), sizeof(InternalAppSpec));
  56.     end; (* SetNthElement *)
  57.  
  58.     function EntryLocked (entries: Handle; index: integer): boolean;
  59.         var
  60.             appspec: InternalAppSpec;
  61.     begin
  62.         GetNthElement(entries, index, appspec);
  63.         EntryLocked := appspec.locked;
  64.     end; (* EntryLocked *)
  65.  
  66.     procedure DimButtons (wt: WindowType);
  67.         var
  68.             have_selection: boolean;
  69.             dlg: DialogPtr;
  70.             selection: integer;
  71.             entries: Handle;
  72.             lh: ListHandle;
  73.     begin
  74.         dlg := windowinfo[wt].window;
  75.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  76.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  77.         selection := SelectedLine(lh);
  78.         have_selection := (selection <> -1);
  79.         SetDCtlEnable(dlg, ditAdd, not IsDocLocked);
  80.         SetDCtlEnable(dlg, ditDelete, have_selection and not EntryLocked(entries, selection + 1));
  81.         SetDCtlEnable(dlg, ditChange, have_selection and not EntryLocked(entries, selection + 1));
  82.         OutlineDefault1(dlg, ditMainUserItem);
  83.     end; (* DimButtons *)
  84.  
  85.     procedure UserItemUpdate (dlg: DialogPtr; item: integer);
  86.         var
  87.             list_rect: Rect;
  88.     begin
  89.         GetDItemRect(dlg, item, list_rect);
  90.         PenNormal;
  91.         InsetRect(list_rect, -1, -1);
  92.         FrameRect(list_rect);
  93.         LUpdate(dlg^.visRgn, ListHandle(windowinfo[GetWindowType(dlg)].items[item]^.spare_data));
  94.     end; (* UserItemUpdate *)
  95.  
  96.     procedure MyLDEF (message: integer; select: boolean; var r: Rect; the_cell: Cell; offset: integer; datalen: integer; lh: ListHandle);
  97.         var
  98.             entries: Handle;
  99.  
  100.         procedure LDDraw;
  101.             const
  102.                 HiliteMode = $938;
  103.             var
  104.                 appspec: InternalAppSpec;
  105.                 pos: longint;
  106.                 err: OSErr;
  107.                 junkpos: longint;
  108.                 suite: Handle;
  109.                 cur_x: integer;
  110.                 junk: OSErr;
  111.                 tmprect: Rect;
  112.                 sys_font_info: FontInfo;
  113.                 top: integer;
  114.                 transfer: integer;
  115.                 rgn: RgnHandle;
  116.                 rgn2: RgnHandle;
  117.         begin
  118.             if datalen = 0 then begin
  119.                 GetNthElement(entries, the_cell.v + 1, appspec);
  120.                 EraseRect(r);
  121.                 cur_x := 0;
  122.                 rgn := NewRgn;
  123.                 if system7 then begin
  124.                     tmprect := r;
  125.                     tmprect.bottom := tmprect.top + 32;
  126.                     tmprect.right := tmprect.left + 32;
  127.                     OffsetRect(tmprect, (kCellHeight - 32) div 2, (kCellHeight - 32) div 2);
  128.                     junk := GetDTDBIconSuiteCached('APPL', appspec.appspec.fCreator, suite);
  129.                     if suite <> nil then begin
  130.                         if select then begin
  131.                             transfer := ttSelected;
  132.                         end
  133.                         else begin
  134.                             transfer := ttNone;
  135.                         end; (* if *)
  136.                         err := PlotIconSuite(tmprect, atNone, transfer, suite);
  137.                         junk := IconSuiteToRgn(rgn, tmprect, atNone, suite);
  138.                     end; (* if *)
  139.                     cur_x := cur_x + kCellHeight;
  140.                 end;
  141.                 cur_x := cur_x + 2;
  142.  
  143.                 TextFont(systemFont);
  144.                 GetFontInfo(sys_font_info);
  145.  
  146.                 top := (kCellHeight - (sys_font_info.ascent + sys_font_info.descent)) div 2;
  147.                 TextFont(systemFont);
  148.                 MoveTo(r.left + cur_x, r.top + top + sys_font_info.ascent);
  149.                 DrawString(concat(copy(appspec.key, length(kICHelper) + 1, 255), GetAString(128, 5), appspec.appspec.name));
  150.  
  151.                 if select then begin
  152.                     rgn2 := NewRgn;
  153.                     RectRgn(rgn2, r);
  154.                     if has_colorQD then begin
  155.                         BitClr(Ptr(HiliteMode), pHiliteBit);
  156.                     end; (* if *)
  157.                     XorRgn(rgn, rgn2, rgn2);
  158.                     InvertRgn(rgn2);
  159.                     DisposeRgn(rgn2);
  160.                 end; (* if *)
  161.                 if rgn <> nil then begin
  162.                     DisposeRgn(rgn);
  163.                 end; (* if *)
  164.             end; (* if *)
  165.         end;
  166.  
  167.     begin
  168.         SetPort(lh^^.port);
  169.         entries := Handle(windowinfo[GetWindowType(lh^^.port)].items[ditList]^.data);
  170.         case message of
  171.             lInitMsg: 
  172.                 ;
  173.             lDrawMsg: 
  174.                 LDDraw;
  175.             lHiliteMsg: 
  176.                 LDDraw;
  177.             lCloseMsg: 
  178.                 ;
  179.             otherwise
  180.                 ;
  181.         end;
  182.     end; (* MyLDEF *)
  183.  
  184.     function WhatOpenHelper (wt: WindowType; item: integer): OSErr;
  185.         var
  186.             dlg: DialogPtr;
  187.             entries: Handle;
  188.             attr: longint;
  189.             err: OSErr;
  190.             count: longint;
  191.             list_rect: Rect;
  192.             data_rect: Rect;
  193.             cell_size: Point;
  194.             lh: ListHandle;
  195.             tmpapspec: InternalAppSpec;
  196.             ndx: longint;
  197.             size: longint;
  198.     begin
  199.         err := noErr;
  200.         windowinfo[wt].items[item]^.spare_data := nil;
  201.         windowinfo[wt].items[item]^.data := nil;
  202.         dlg := windowinfo[wt].window;
  203.         SetDItemHandle(dlg, item, @UserItemUpdate);
  204.         entries := NewHandle(0);
  205.         if entries = nil then begin
  206.             err := memFullErr;
  207.         end; (* if *)
  208.         if err = noErr then begin
  209.             ndx := 1;
  210.             repeat
  211.                 err := ICMapErr(ICGetIndPref(GetInstance, ndx, tmpapspec.key));
  212.                 if err = noErr then begin
  213.                     if IUEqualString(copy(tmpapspec.key, 1, length(kICHelper)), kICHelper) = 0 then begin
  214.                         size := sizeof(tmpapspec.appspec);
  215.                         err := ICMapErr(ICGetPref(GetInstance, tmpapspec.key, attr, @tmpapspec.appspec, size));
  216.                         if err = noErr then begin
  217.                             tmpapspec.locked := btst(attr, ICattr_locked_bit) | IsDocLocked;
  218.                             err := PtrAndHand(@tmpapspec, entries, sizeof(InternalAppSpec));
  219.                         end; (* if *)
  220.                     end; (* if *)
  221.                 end; (* if *)
  222.                 ndx := ndx + 1;
  223.             until err <> noErr;
  224.         end; (* if *)
  225.         if err = icPrefNotFoundErr then begin
  226.             err := noErr;
  227.         end; (* if *)
  228.         if err = noErr then begin
  229.             count := GetHandleSize(entries) div sizeof(InternalAppSpec);
  230.             windowinfo[wt].items[item]^.data := Ptr(entries);
  231.             GetDItemRect(dlg, item, list_rect);
  232.             list_rect.right := list_rect.right - 15;
  233.             SetRect(data_rect, 0, 0, 1, count);
  234.             SetPt(cell_size, list_rect.right - list_rect.left, kCellHeight);
  235.             lh := LNew(list_rect, data_rect, cell_size, 128, dlg, true, false, false, true);
  236.             if lh = nil then begin
  237.                 err := memFullErr;
  238.             end; (* if *)
  239.         end; (* if *)
  240.         if err = noErr then begin
  241.             lh^^.refCon := ord(@MyLDEF);
  242.             lh^^.selFlags := lOnlyOne;
  243.             windowinfo[wt].items[item]^.spare_data := Ptr(lh);
  244.             DimButtons(wt);
  245.             SetUpDefaultOutline(dlg, ditChange, ditMainUserItem);
  246.             windowinfo[wt].selected_item := ditList;
  247.         end; (* if *)
  248.         WhatOpenHelper := err;
  249.     end; (* WhatOpenHelper *)
  250.  
  251.     function ChooseApplication (var spec: ICAppSpec): boolean;
  252.         var
  253.             valid: boolean;
  254.             info: FInfo;
  255.             fs: FSSpec;
  256.             err: OSErr;
  257.     begin
  258.         err := ICStandardGetFile('APPL', fs, info);
  259.         DisplayError(acChooseApplication, err);
  260.         if err = noErr then begin
  261.             spec.fCreator := info.fdCreator;
  262.             spec.name := fs.name;
  263.         end; (* if *)
  264.         ChooseApplication := err = noErr;
  265.     end; (* ChooseApplication *)
  266.  
  267.     procedure FixButton (dlg: DialogPtr);
  268.         var
  269.             t1, t2: Str255;
  270.     begin
  271.         GetItemText(dlg, ditAppName, t1);
  272.         GetItemText(dlg, ditHelper, t2);
  273.         SetDCtlEnable(dlg, ditOK, (t1 <> '') and (t2 <> ''));
  274.         OutlineDefault1(dlg, ditAddUserItem);
  275.     end; (* FixButton *)
  276.  
  277.     function DoAddFilter (dlg: DialogPtr; var event: EventRecord; var item: integer): boolean;
  278.         var
  279.             res: boolean;
  280.     begin
  281.         res := CancelModalFilter(dlg, event, item);
  282.         FixButton(dlg);
  283.         DoAddFilter := res;
  284.     end;(* DoAddFilter *)
  285.  
  286.     function DoEdit (entries: Handle; lh: ListHandle; var choosen_app: InternalAppSpec): OSErr;
  287.         var
  288.             dlg: DialogPtr;
  289.             item: integer;
  290.             junk: integer;
  291.             err: OSErr;
  292.     begin
  293.         err := noErr;
  294.         dlg := GetNewDialog(800, nil, WindowPtr(-1));
  295.         if dlg = nil then begin
  296.             err := memFullErr;
  297.         end; (* if *)
  298.         if err = noErr then begin
  299.             SetUpDefaultOutline(dlg, ditOK, ditAddUserItem);
  300.             SetItemText(dlg, ditHelper, choosen_app.key);
  301.             SetItemText(dlg, ditAppName, choosen_app.appspec.name);
  302.             SelIText(dlg, ditHelper, 0, 255);
  303.             FixButton(dlg);
  304.             ShowWindow(dlg);
  305.             InitCursor;
  306.             repeat
  307.                 ModalDialog(@DoAddFilter, item);
  308.                 case item of
  309.                     ditChooseApplication:  begin
  310.                         if ChooseApplication(choosen_app.appspec) then begin
  311.                             SetItemText(dlg, ditAppName, choosen_app.appspec.name);
  312.                             FixButton(dlg);
  313.                         end; (* if *)
  314.                     end;
  315.                     otherwise
  316.                         ;
  317.                 end; (* case *)
  318.             until item in [ditOK, ditCancel];
  319.             if item = ditOK then begin
  320.                 GetItemText(dlg, ditHelper, choosen_app.key);
  321.                 choosen_app.key := concat(kICHelper, choosen_app.key);
  322.             end
  323.             else begin
  324.                 err := userCanceledErr;
  325.             end; (* if *)
  326.             DisposeDialog(dlg);
  327.         end; (* if *)
  328.         DoEdit := err;
  329.     end;
  330.  
  331.     function DoAdd (entries: Handle; lh: ListHandle): OSErr;
  332.         var
  333.             choosen_app: InternalAppSpec;
  334.             dlg: DialogPtr;
  335.             item: integer;
  336.             junk: integer;
  337.             err: OSErr;
  338.     begin
  339.         choosen_app.appspec.name := '';
  340.         choosen_app.key := '';
  341.         err := DoEdit(entries, lh, choosen_app);
  342.         if err = noErr then begin
  343.             err := PtrAndHand(@choosen_app, entries, sizeof(choosen_app));
  344.             if err = noErr then begin
  345.                 junk := LAddRow(1, 32767, lh);
  346.             end; (* if *)
  347.         end;
  348.         DoAdd := err;
  349.     end; (* DoAdd *)
  350.  
  351.     function DoChange (selection: integer; entries: Handle; lh: ListHandle): OSErr;
  352.         var
  353.             err: OSErr;
  354.             tmpspec: InternalAppSpec;
  355.     begin
  356.         GetNthElement(entries, selection + 1, tmpspec);
  357.         Delete(tmpspec.key, 1, length(kICHelper));
  358.         err := DoEdit(entries, lh, tmpspec);
  359.         if err = noErr then begin
  360.             SetNthElement(entries, selection + 1, tmpspec);
  361.             err := noErr;
  362.         end
  363.         else begin
  364.             err := userCanceledErr;
  365.         end; (* if *)
  366.         DoChange := err;
  367.     end; (* DoChange *)
  368.  
  369.     function DoDelete (selection: integer; entries: Handle; lh: ListHandle): OSErr;
  370.         var
  371.             err: OSErr;
  372.             apspec: InternalAppSpec;
  373.             pos: longint;
  374.             junk: OSErr;
  375.     begin
  376.         err := ICMapErr(ICBegin(GetInstance, icReadWritePerm));
  377.         if err = noErr then begin
  378.             GetNthElement(entries, selection + 1, apspec);
  379.             err := ICDeletePref(GetInstance, apspec.key);
  380.             junk := ICMapErr(ICEnd(GetInstance));
  381.         end; (* if *)
  382.         if err = noErr then begin
  383.             pos := Munger(entries, selection * sizeof(InternalAppSpec), nil, sizeof(InternalAppSpec), Ptr(-1), 0);
  384.             err := MemError;
  385.             if err = noErr then begin
  386.                 LDelRow(1, selection, lh);
  387.             end; (* if *)
  388.         end; (* if *)
  389.         DoDelete := err;
  390.     end; (* DoDelete *)
  391.  
  392.     function WhatClickHelper (wt: WindowType; item: integer; er: eventRecord): OSErr;
  393.         var
  394.             lh: ListHandle;
  395.             entries: Handle;
  396.             selection: integer;
  397.             err: OSErr;
  398.             pos: longint;
  399.             r: Rect;
  400.     begin
  401.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  402.         lh := ListHandle(windowinfo[wt].items[ditList]^.spare_data);
  403.         GlobalToLocal(er.where);
  404.         selection := SelectedLine(lh);
  405.         err := 1;
  406.         case item of
  407.             ditAdd: 
  408.                 err := DoAdd(entries, lh);
  409.             ditChange: 
  410.                 err := DoChange(selection, entries, lh);
  411.             ditDelete: 
  412.                 if selection <> -1 then begin
  413.                     err := DoDelete(selection, entries, lh);
  414.                 end; (* if *)
  415.             ditList:  begin
  416.                 if LClick(er.where, 0, lh) then begin
  417.                     selection := SelectedLine(lh);            (* selection may have been changed by LClick *)
  418.                     if EntryLocked(entries, selection + 1) then begin
  419.                         LockedAlert(wt, item);
  420.                         err := userCanceledErr;
  421.                     end
  422.                     else begin
  423.                         FlashItem(windowinfo[wt].window, ditChange);
  424.                         err := DoChange(selection, entries, lh);
  425.                     end; (* if *)
  426.                 end; (* if *)
  427.             end;
  428.         end; (* case *)
  429.         if err = noErr then begin
  430.             DirtyDocument;
  431.         end; (* if *)
  432.         if err = 1 then begin
  433.             err := noErr;
  434.         end; (* if *)
  435.         DimButtons(wt);
  436.         WhatClickHelper := err;
  437.     end; (* WhatClickHelper *)
  438.  
  439.     function WhatFlushHelper (wt: WindowType; item: integer): OSErr;
  440.         var
  441.             err: OSerr;
  442.             entries: Handle;
  443.             i: integer;
  444.             appspec: InternalAppSpec;
  445.             junk: OSErr;
  446.             first_err: OSErr;
  447.     begin
  448.         err := noErr;
  449.         entries := Handle(windowinfo[wt].items[ditList]^.data);
  450.         first_err := noErr;
  451.         for i := 1 to GetHandleSize(entries) div sizeof(InternalAppSpec) do begin
  452.             GetNthElement(entries, i, appspec);
  453.             err := ICMapErr(ICSetPref(GetInstance, appspec.key, ICattr_no_change, @appspec.appspec, sizeof(appspec.appspec)));
  454.             if first_err = noErr then begin
  455.                 first_err := err;
  456.             end; (* if *)
  457.         end; (* for *)
  458.         err := first_err;
  459.         WhatFlushHelper := err;
  460.     end; (* WhatFlushHelper *)
  461.  
  462.     function WhatCloseHelper (wt: WindowType; item: integer): OSErr;
  463.     begin
  464.         LDispose(ListHandle(windowinfo[wt].items[item]^.spare_data));
  465.         DisposeHandle(Handle(windowinfo[wt].items[ditList]^.data));
  466.         WhatCloseHelper := noErr;
  467.     end; (* WhatCloseHelper *)
  468.  
  469.     function WhatActivateHelper (wt: WindowType; item: integer; activate: boolean): OSErr;
  470.     begin
  471.         LActivate(activate, ListHandle(windowinfo[wt].items[item]^.spare_data));
  472.         WhatActivateHelper := noErr;
  473.     end; (* WhatActivateHelper *)
  474.  
  475.     function GetEntryName (list: ListHandle; c: cell): str255;
  476.         var
  477.             appspec: InternalAppSpec;
  478.             entries: handle;
  479.     begin
  480.         GetEntryName := '';
  481.         entries := Handle(windowinfo[GetWindowType(list^^.port)].items[ditList]^.data);
  482.         GetNthElement(entries, c.v + 1, appspec);
  483.         GetEntryName := concat(copy(appspec.key, length(kICHelper) + 1, 255), GetAString(128, 5), appspec.appspec.name);
  484.     end;
  485.  
  486.     function WhatKeyHelper (wt: WindowType; item: integer; er: EventRecord): OSErr;
  487.         var
  488.             ch: integer;
  489.             lh: ListHandle;
  490.             err: OSErr;
  491.             entries: Handle;
  492.             selection: integer;
  493.     begin
  494.         err := noErr;
  495.         if (er.what = keyDown) or (er.what = autoKey) then begin
  496.             ch := BAND(er.message, $FF);
  497.             case ch of
  498.                 crChar, enterChar:  begin
  499.                     if GetDCtlEnable(windowinfo[wt].window, ditChange) then begin
  500.                         entries := Handle(windowinfo[wt].items[ditList]^.data);
  501.                         lh := ListHandle(windowinfo[wt].items[item]^.spare_data);
  502.                         selection := SelectedLine(lh);
  503.                         FlashItem(windowinfo[wt].window, ditChange);
  504.                         err := DoChange(selection, entries, lh);
  505.                         if err = noErr then begin
  506.                             DirtyDocument;
  507.                         end;
  508.                     end;
  509.                 end;
  510.                 otherwise begin
  511.                     DoListKey(ListHandle(windowinfo[wt].items[item]^.spare_data), er.modifiers, chr(BAND(er.message, $FF)), @GetEntryName);
  512.                     DimButtons(wt);
  513.                 end;
  514.             end;
  515.         end;
  516.         WhatKeyHelper := err;
  517.     end; (* WhatKeyHelper *)
  518.  
  519.     function WhatCursorHelper (wt: WindowType; item: integer; pt: Point; cursorid: integer): OSErr;
  520.         var
  521.             r: Rect;
  522.     begin
  523.         GetDItemRect(windowinfo[wt].window, item, r);
  524.         InsetRect(r, 15, 0);
  525.         if PtInRect(pt, r) then begin
  526.             SetCursor(GetCursor(cursorid)^^);
  527.         end
  528.         else begin
  529.             InitCursor;
  530.         end; (* if *)
  531.     end; (* WhatCursorHelper *)
  532.  
  533. end. (* ICHelperWhat *)
  534.